#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;

// ---- SIGCHLD ---

void handler(int sig)
{
    std::cout << "sig: " << sig << std::endl;
    while (true)
    {
        pid_t rid = waitpid(-1, nullptr, 0);
        if (rid > 0)
        {
            std::cout << "wait success ,pid = " << rid << std::endl;
        }
        else
        {
            std::cout << "wait done" << std::endl;
            break;
        }
    }
}
void doOtherThing()
{
    std::cout<<"work..."<<std::endl;
    sleep(100);
}
int main()
{
    signal(SIGCHLD, handler);
    for (int i = 0; i < 10; i++)
    {
        pid_t id = fork();
        if (id == 0)
        {
            std::cout << "i am child process" << std::endl;
            sleep(3);
            exit(1);
        }
    }
    doOtherThing();
    return 0;
}
// volatile---关键字

//---testcode---//
// volatile int flag = 0;
// void handler(int sig)
// {
//     std::cout<<"sig = "<<sig<<std::endl;
//     flag = 1;
// }
// int main()
// {
//     signal(SIGINT,handler);
//     while(!flag);
//     std::cout<<"proccess exit..."<<std::endl;
//     return 0;
// }